.text
.globl main
.type main @function
main:
    pushq %rbp
    movq %rsp, %rbp

    subq $16, %rsp
    // times
    movl $5, -8(%rbp)
    // ch 33是!的ASCII码
    movb $33, -9(%rbp)
    movss .LC0(%rip), %xmm0
    // f
    movss %xmm0, -4(%rbp)

    movl -8(%rbp) /* times */, %edi
    call pound

    movsbl -9(%rbp) /* ch */, %edi
    call pound

    /*  
    // f
    movss -4(%rbp) , %xmm0
    cvttss2sil %xmm0, %edi
    call pound
    */
    
    // 这是当函数声明时的代码，这个是把f转换成double，放到xmm0，而edi没有设置，所以edi是个随机值
    pxor %xmm1, %xmm1
    cvtss2sd -4(%rbp), %xmm1
    movq %xmm1, %rax
    movq %rax, %xmm0
    movl $1, %eax
    call pound
    
    movl $0, %eax
    movq %rbp, %rsp
    popq %rbp
    ret

.text
.globl pound
.type pound, @function
pound:
    pushq %rbp
    movq %rsp, %rbp
    subq $16, %rsp
    // n
    // 这里我本以为可以直接用%edi，但是我们需要用edi来调用函数，所以需要用临时变量保存起来
    movl %edi, -4(%rbp)

    jmp .L4

.L5:
    movl $35, %edi
    call putchar
.L4:
    subl $1, -4(%rbp) /* n */
    movl -4(%rbp), %eax
    testl %eax, %eax
    jg .L5

    movl $10, %edi
    call putchar

    movq %rbp, %rsp
    popq %rbp
    ret

.LC0:
    .long 1086324736